#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_WORD 200


int contaASCII(char palavra[]){
    int soma=0, i;

    for (i=0; i<=strlen(palavra); i++){
        soma+= (int) palavra[i];

    }
return soma;

}

int ehPrimo(char palavra[]) {
    int i, j, *vetor, z=-1, *primos, valor;

    valor = contaASCII(palavra);

    vetor = (int*) malloc (valor*sizeof(int));
    primos = (int*) malloc (valor*sizeof(int));

    for(i=2; i<=valor; i++){
        vetor[i]=i;
    }

    for(i=2; i<=valor; i++){
        if(vetor[i]==i){
            primos[++z] = i;
            for (j=2*i; j<=valor; j+=i) {
                vetor[j]=0;
            }
        }
    }

    if(primos[z]==valor)
    {
        printf("O numero %d eh primo.\n", valor);
	return 1;
    }

return 0;
}


int palindromo(char *word, int numcarac)
{
	int i,j,k,l;
	char buff[MAX_WORD];

	// palavras com numero par de caracteres
	if(numcarac % 2 == 0)
	{
		i = (numcarac / 2) - 1;
		for(j=0; j<=i;j++)
			buff[j] = word[j];

		buff[j] = '\0';
		//faz verificacao espelhada
		for(k = j,l=j-1; k<numcarac;k++)
		{
			if(buff[l] != word[k])	//verifica o palindromo
				return 0; 
			else l--;
		}
		// caso nao encontra erro de espelhamento eh palindromo
		return 1;
	}
	// palavras com numero impar de caracteres
	else 
	{
		i = numcarac / 2;
		for(j=0; j<i;j++)
			buff[j] = word[j];

		buff[j] = '\0';
		//faz verificacao espelhada
		for(k = j+1,l=j-1; k<numcarac;k++)
		{
			if(buff[l] != word[k]) //verifica o palindromo
				return 0;
			else l--;
		}
		//caso nao encontra erro de espelhamento eh palindromo
		return 1;
	}
}


int main(int argc, char * argv[])
{
	FILE *fp;
	char word[MAX_WORD];
	int i,j;
	int numcarac = 0;
	int count_div = 0;
	int numWordPalindromo = 0;
	int NUM_BLOCK = 0;	// Divisao em Blocos para leitura do file
	size_t resultado;
	
	if(argc < 2)
	{
		printf("passe o arquivo de leitura como argumento!\n");
	}
	else
	{
		if(!(fp = fopen(argv[1],"r")))
		{
			printf("erro! Impossivel abrir o arquivo\n");
			return 0;
		}
		// calcula tamanho do arquivo para jogar em um buffer dinamico
		fseek(fp,0,SEEK_END);
		long tam_file = ftell(fp);
		rewind(fp);
	        
		NUM_BLOCK = 15;
		printf("tamfile= %ld\n",tam_file);
		long part_file = tam_file/NUM_BLOCK;
		printf("part_file = %ld\n",part_file);
		char *buffer;
		
		for(count_div = 0 ; count_div < NUM_BLOCK ; count_div++)
		{
		    // no ultimo bloco alocar mais espaco para ajuste
		    if(count_div == NUM_BLOCK-1)
		    {
			buffer = (char*)malloc(sizeof(char)*(part_file+51));
		    }
		    else
		    {
		        buffer = (char*)malloc(sizeof(char)*(part_file + 1));
		    }
		    
		    if(buffer != NULL)
		    {        
			    // no ultimo bloco ler mais dados
			    if(count_div == NUM_BLOCK-1)
			    {
			      resultado = fread(buffer,1,part_file+50,fp);
			    }
			    else
			    {
			      resultado = fread(buffer,1,part_file,fp);
			    }
			    buffer[resultado+1]='\0';
			      
			    //verifica se a operacao foi feita com sucesso
			    //if( resultado == part_file)
			    //{
				    //printf("tamfile = %ld\n",part_file);
				    //printf("count=%d\n",count_div);
				    for(i=0; i<resultado;i++)
				    {
				            // coloca os caracteres em letras minusculas	
					    buffer[i] = tolower(buffer[i]);
					    //verifica caractere de separacao de palavra
					    if(buffer[i] == ' ' || buffer[i]=='\n'
					    || buffer[i] == '\0' || buffer[i]=='\t')
					    {
						    word[numcarac] = '\0'; 
						    // Verifica se a palavra em mais de 1 caractere
						    if(numcarac > 1 && numcarac < MAX_WORD)
						    {
							   /* == maior palavra com 603 caracteres ==
							   if(numcarac > 100)
							   {
								printf("numcaracteres=%d\n",numcarac);
								puts(word);
								getchar();
							   }*/
							    // chama funcao palindromo para verificar palindromo de palavra
							    if(palindromo(word,numcarac))
							    {
								    if(ehPrimo(word))
								    {
								      puts(word);
								      numWordPalindromo++;
								    }
							    }
							    //reinicia contagem de caracteres da palavra
							    //numcarac = 0;
						    }
						    //reinicia a contagem de caracteres da palavra
						    numcarac = 0;
					    }
					    //ignora pontos e caracteres invalidos / verifica numero maximo de caracteres
					    else if(isalnum(buffer[i]) && numcarac < MAX_WORD)
					    {
						    word[numcarac] = buffer[i];
						    numcarac++;
					    }
				    }
			   // }
		    }
		    buffer = NULL;
		}
		printf("Numero de Palavras palindromo: %d\n",numWordPalindromo);
		fclose(fp);	//fecha o arquivo
		free(buffer);	//libera memoria do buffer
	}
	return 0;
}
